package com.cty.secondDay;
/*
 *
 *   给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表
 *
 *
 * */

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

public class Q_2 {
    public static void main(String[] args) {
        String[] strs = {"eat", "tea", "tan", "ate", "nat", "bat"};
        List<List<String>> lists = groupAnagrams2(strs);
        Object[] array = lists.toArray();
        System.out.println(Arrays.toString(array));
    }

    //第一种方法 排序字符串
    public static List<List<String>> groupAnagrams(String[] strs) {
        //字符串数组为空 返回一个空的列表
        if (strs.length == 0) return new ArrayList<>();
        //创建一个散列表
        HashMap<String, ArrayList> targetMap = new HashMap<>();
        for (int i = 0; i < strs.length; i++) {
            char[] charArray = strs[i].toCharArray();
            Arrays.sort(charArray);
            String key = String.valueOf(charArray);
            // 判断散列表是否存在排序后的键值 不存在 就新创建一个列表存入
            if (!targetMap.containsKey(key)) {
                ArrayList<Object> list = new ArrayList<>();
                list.add(strs[i]);
                targetMap.put(key, list);
                continue;
            }
            //存在 就直接取出存入即可
            targetMap.get(key).add(strs[i]);
        }
        return new ArrayList(targetMap.values());
    }

    //第二种方法 标识字符串
    public static List<List<String>> groupAnagrams2(String[] strs) {
        //字符串数组为空 返回一个空的列表
        if (strs.length == 0) return new ArrayList<>();
        HashMap<String, ArrayList> targetMap = new HashMap<>();
        //代表26个字母的数量（下标表示是哪个字母 ）
        int[] flag = new int[26];
        for (int i = 0; i < strs.length; i++) {
            //flag应在这里买呢清空
            Arrays.fill(flag,0);
            for (char c: strs[i].toCharArray()) {
                flag[c - 'a']++;
            }
            System.out.println(Arrays.toString(flag));
            String key = "";
            for (int n : flag) {
                key += "#" + n;
            }
            System.out.println(key);
            if (!targetMap.containsKey(key)) {
                ArrayList<Object> list = new ArrayList<>();
                list.add(strs[i]);
                targetMap.put(key, list);
                continue;
            }
            //存在 就直接取出存入即可
            targetMap.get(key).add(strs[i]);
        }
        return new ArrayList(targetMap.values());
    }
}
